/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.inputmethod.keyboard.internal;

import java.util.HashMap;
import java.util.Locale;

/**
 * !!!!! DO NOT EDIT THIS FILE !!!!!
 *
 * This file is generated by tools/make-keyboard-text. The base template file is
 *   tools/make-keyboard-text/res/src/com/android/inputmethod/keyboard/internal/
 *   KeyboardTextsTable.tmpl
 *
 * This file must be updated when any text resources in keyboard layout files have been changed.
 * These text resources are referred as "!text/<resource_name>" in keyboard XML definitions,
 * and should be defined in
 *   tools/make-keyboard-text/res/values-<locale>/donottranslate-more-keys.xml
 *
 * To update this file, please run the following commands.
 *   $ cd $ANDROID_BUILD_TOP
 *   $ mmm packages/inputmethods/LatinIME/tools/make-keyboard-text
 *   $ make-keyboard-text -java packages/inputmethods/LatinIME/java
 *
 * The updated source file will be generated to the following path (this file).
 *   packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/internal/
 *   KeyboardTextsTable.java
 */
public final class KeyboardTextsTable {
    // Name to index map.
    private static final HashMap<String, Integer> sNameToIndexesMap = new HashMap<>();
    // Locale to texts table map.
    private static final HashMap<String, String[]> sLocaleToTextsTableMap = new HashMap<>();
    // TODO: Remove this variable after debugging.
    // Texts table to locale maps.
    private static final HashMap<String[], String> sTextsTableToLocaleMap = new HashMap<>();

    public static String getText(final String name, final String[] textsTable) {
        final Integer indexObj = sNameToIndexesMap.get(name);
        if (indexObj == null) {
            throw new RuntimeException("Unknown text name=" + name + " locale="
                    + sTextsTableToLocaleMap.get(textsTable));
        }
        final int index = indexObj;
        final String text = (index < textsTable.length) ? textsTable[index] : null;
        if (text != null) {
            return text;
        }
        // Sanity check.
        if (index >= 0 && index < TEXTS_DEFAULT.length) {
            return TEXTS_DEFAULT[index];
        }
        // Throw exception for debugging purpose.
        throw new RuntimeException("Illegal index=" + index + " for name=" + name
                + " locale=" + sTextsTableToLocaleMap.get(textsTable));
    }

    public static String[] getTextsTable(final Locale locale) {
        final String localeKey = locale.toString();
        if (sLocaleToTextsTableMap.containsKey(localeKey)) {
            return sLocaleToTextsTableMap.get(localeKey);
        }
        final String languageKey = locale.getLanguage();
        if (sLocaleToTextsTableMap.containsKey(languageKey)) {
            return sLocaleToTextsTableMap.get(languageKey);
        }
        return TEXTS_DEFAULT;
    }

    private static final String[] NAMES = {
    //  /* index:histogram */ "name",
        /*   0:12 */ "keylabel_to_alpha",
        /*   1:12 */ "additional_morekeys_symbols_1",
        /*   2:12 */ "additional_morekeys_symbols_2",
        /*   3:12 */ "additional_morekeys_symbols_3",
        /*   4:12 */ "additional_morekeys_symbols_4",
        /*   5:12 */ "additional_morekeys_symbols_5",
        /*   6:12 */ "additional_morekeys_symbols_6",
        /*   7:12 */ "additional_morekeys_symbols_7",
        /*   8:12 */ "additional_morekeys_symbols_8",
        /*   9:12 */ "additional_morekeys_symbols_9",
        /*  10:12 */ "additional_morekeys_symbols_0",
        /*  11:11 */ "keyspec_symbols_1",
        /*  12:11 */ "keyspec_symbols_2",
        /*  13:11 */ "keyspec_symbols_3",
        /*  14:11 */ "keyspec_symbols_4",
        /*  15:11 */ "keyspec_symbols_5",
        /*  16:11 */ "keyspec_symbols_6",
        /*  17:11 */ "keyspec_symbols_7",
        /*  18:11 */ "keyspec_symbols_8",
        /*  19:11 */ "keyspec_symbols_9",
        /*  20:11 */ "keyspec_symbols_0",
        /*  21:11 */ "keylabel_to_symbol",
        /*  22: 2 */ "morekeys_a",
        /*  23: 2 */ "morekeys_e",
        /*  24: 2 */ "morekeys_i",
        /*  25: 2 */ "morekeys_o",
        /*  26: 2 */ "morekeys_u",
        /*  27: 2 */ "morekeys_s",
        /*  28: 2 */ "morekeys_n",
        /*  29: 2 */ "morekeys_c",
        /*  30: 1 */ "morekeys_y",
        /*  31: 1 */ "morekeys_d",
        /*  32: 1 */ "morekeys_r",
        /*  33: 1 */ "morekeys_t",
        /*  34: 1 */ "morekeys_z",
        /*  35: 1 */ "morekeys_k",
        /*  36: 1 */ "morekeys_l",
        /*  37: 1 */ "morekeys_g",
        /*  38: 1 */ "morekeys_h",
        /*  39: 1 */ "morekeys_j",
        /*  40: 1 */ "morekeys_w",
        /*  41: 0 */ "morekeys_v",
        /*  42: 0 */ "morekeys_q",
        /*  43: 0 */ "morekeys_x",
        /*  44: 0 */ "keyspec_q",
        /*  45: 0 */ "keyspec_w",
        /*  46: 0 */ "keyspec_y",
        /*  47: 0 */ "keyspec_x",
        /*  48: 0 */ "keyspec_nordic_row1_11",
        /*  49: 0 */ "keyspec_nordic_row2_10",
        /*  50: 0 */ "keyspec_nordic_row2_11",
        /*  51: 0 */ "morekeys_nordic_row2_10",
        /*  52: 0 */ "morekeys_nordic_row2_11",
        /*  53: 0 */ "keyspec_east_slavic_row1_9",
        /*  54: 0 */ "keyspec_east_slavic_row2_2",
        /*  55: 0 */ "keyspec_east_slavic_row2_11",
        /*  56: 0 */ "keyspec_east_slavic_row3_5",
        /*  57: 0 */ "morekeys_east_slavic_row2_2",
        /*  58: 0 */ "morekeys_east_slavic_row2_11",
        /*  59: 0 */ "morekeys_cyrillic_u",
        /*  60: 0 */ "morekeys_cyrillic_ka",
        /*  61: 0 */ "morekeys_cyrillic_en",
        /*  62: 0 */ "morekeys_cyrillic_ghe",
        /*  63: 0 */ "morekeys_cyrillic_a",
        /*  64: 0 */ "morekeys_cyrillic_o",
        /*  65: 0 */ "morekeys_cyrillic_i",
        /*  66: 0 */ "morekeys_cyrillic_ie",
        /*  67: 0 */ "morekeys_cyrillic_soft_sign",
        /*  68: 0 */ "keyspec_south_slavic_row1_6",
        /*  69: 0 */ "keyspec_south_slavic_row2_11",
        /*  70: 0 */ "keyspec_south_slavic_row3_1",
        /*  71: 0 */ "keyspec_south_slavic_row3_8",
        /*  72: 0 */ "keyspec_swiss_row1_11",
        /*  73: 0 */ "keyspec_swiss_row2_10",
        /*  74: 0 */ "keyspec_swiss_row2_11",
        /*  75: 0 */ "morekeys_swiss_row1_11",
        /*  76: 0 */ "morekeys_swiss_row2_10",
        /*  77: 0 */ "morekeys_swiss_row2_11",
        /*  78: 0 */ "single_quotes",
        /*  79: 0 */ "double_quotes",
        /*  80: 0 */ "single_angle_quotes",
        /*  81: 0 */ "double_angle_quotes",
        /*  82: 0 */ "morekeys_currency_dollar",
        /*  83: 0 */ "keylabel_for_currency",
        /*  84: 0 */ "morekeys_currency_generic",
        /*  85: 0 */ "morekeys_punctuation",
        /*  86: 0 */ "morekeys_tablet_punctuation",
        /*  87: 0 */ "keyspec_spanish_row2_10",
        /*  88: 0 */ "morekeys_star",
        /*  89: 0 */ "morekeys_bullet",
        /*  90: 0 */ "morekeys_plus",
        /*  91: 0 */ "morekeys_left_parenthesis",
        /*  92: 0 */ "morekeys_right_parenthesis",
        /*  93: 0 */ "morekeys_less_than",
        /*  94: 0 */ "morekeys_greater_than",
        /*  95: 0 */ "morekeys_arabic_diacritics",
        /*  96: 0 */ "morekeys_symbols_1",
        /*  97: 0 */ "morekeys_symbols_2",
        /*  98: 0 */ "morekeys_symbols_3",
        /*  99: 0 */ "morekeys_symbols_4",
        /* 100: 0 */ "morekeys_symbols_5",
        /* 101: 0 */ "morekeys_symbols_6",
        /* 102: 0 */ "morekeys_symbols_7",
        /* 103: 0 */ "morekeys_symbols_8",
        /* 104: 0 */ "morekeys_symbols_9",
        /* 105: 0 */ "morekeys_symbols_0",
        /* 106: 0 */ "keyspec_left_parenthesis",
        /* 107: 0 */ "keyspec_right_parenthesis",
        /* 108: 0 */ "keyspec_left_square_bracket",
        /* 109: 0 */ "keyspec_right_square_bracket",
        /* 110: 0 */ "keyspec_left_curly_bracket",
        /* 111: 0 */ "keyspec_right_curly_bracket",
        /* 112: 0 */ "keyspec_less_than",
        /* 113: 0 */ "keyspec_greater_than",
        /* 114: 0 */ "keyspec_less_than_equal",
        /* 115: 0 */ "keyspec_greater_than_equal",
        /* 116: 0 */ "keyspec_left_double_angle_quote",
        /* 117: 0 */ "keyspec_right_double_angle_quote",
        /* 118: 0 */ "keyspec_left_single_angle_quote",
        /* 119: 0 */ "keyspec_right_single_angle_quote",
        /* 120: 0 */ "keyspec_comma",
        /* 121: 0 */ "keyspec_tablet_comma",
        /* 122: 0 */ "keyhintlabel_tablet_comma",
        /* 123: 0 */ "morekeys_tablet_comma",
        /* 124: 0 */ "keyspec_period",
        /* 125: 0 */ "keyhintlabel_period",
        /* 126: 0 */ "morekeys_period",
        /* 127: 0 */ "keyspec_tablet_period",
        /* 128: 0 */ "keyhintlabel_tablet_period",
        /* 129: 0 */ "morekeys_tablet_period",
        /* 130: 0 */ "keyspec_symbols_question",
        /* 131: 0 */ "keyspec_symbols_semicolon",
        /* 132: 0 */ "keyspec_symbols_percent",
        /* 133: 0 */ "morekeys_exclamation",
        /* 134: 0 */ "morekeys_question",
        /* 135: 0 */ "morekeys_symbols_semicolon",
        /* 136: 0 */ "morekeys_symbols_percent",
        /* 137: 0 */ "morekeys_am_pm",
        /* 138: 0 */ "keyspec_settings",
        /* 139: 0 */ "keyspec_shortcut",
        /* 140: 0 */ "keyspec_action_next",
        /* 141: 0 */ "keyspec_action_previous",
        /* 142: 0 */ "keylabel_to_more_symbol",
        /* 143: 0 */ "keylabel_tablet_to_more_symbol",
        /* 144: 0 */ "keylabel_to_phone_numeric",
        /* 145: 0 */ "keylabel_to_phone_symbols",
        /* 146: 0 */ "keylabel_time_am",
        /* 147: 0 */ "keylabel_time_pm",
        /* 148: 0 */ "keyspec_popular_domain",
        /* 149: 0 */ "morekeys_popular_domain",
        /* 150: 0 */ "keyspecs_left_parenthesis_more_keys",
        /* 151: 0 */ "keyspecs_right_parenthesis_more_keys",
        /* 152: 0 */ "single_laqm_raqm",
        /* 153: 0 */ "single_raqm_laqm",
        /* 154: 0 */ "double_laqm_raqm",
        /* 155: 0 */ "double_raqm_laqm",
        /* 156: 0 */ "single_lqm_rqm",
        /* 157: 0 */ "single_9qm_lqm",
        /* 158: 0 */ "single_9qm_rqm",
        /* 159: 0 */ "single_rqm_9qm",
        /* 160: 0 */ "double_lqm_rqm",
        /* 161: 0 */ "double_9qm_lqm",
        /* 162: 0 */ "double_9qm_rqm",
        /* 163: 0 */ "double_rqm_9qm",
        /* 164: 0 */ "morekeys_single_quote",
        /* 165: 0 */ "morekeys_double_quote",
        /* 166: 0 */ "morekeys_tablet_double_quote",
        /* 167: 0 */ "keyspec_emoji_action_key",
    };

    private static final String EMPTY = "";

    /* Default texts */
    private static final String[] TEXTS_DEFAULT = {
        // Label for "switch to alphabetic" key.
        /* keylabel_to_alpha */ "ABC",
        /* additional_morekeys_symbols_1 ~ */
        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
        /* ~ additional_morekeys_symbols_0 */
        /* keyspec_symbols_1 */ "1",
        /* keyspec_symbols_2 */ "2",
        /* keyspec_symbols_3 */ "3",
        /* keyspec_symbols_4 */ "4",
        /* keyspec_symbols_5 */ "5",
        /* keyspec_symbols_6 */ "6",
        /* keyspec_symbols_7 */ "7",
        /* keyspec_symbols_8 */ "8",
        /* keyspec_symbols_9 */ "9",
        /* keyspec_symbols_0 */ "0",
        // Label for "switch to symbols" key.
        /* keylabel_to_symbol */ "?123",
        /* morekeys_a ~ */
        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
        /* ~ morekeys_x */
        /* keyspec_q */ "q",
        /* keyspec_w */ "w",
        /* keyspec_y */ "y",
        /* keyspec_x */ "x",
        /* keyspec_nordic_row1_11 ~ */
        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
        EMPTY, EMPTY, EMPTY, EMPTY,
        /* ~ morekeys_swiss_row2_11 */
        /* single_quotes */ "!text/single_lqm_rqm",
        /* double_quotes */ "!text/double_lqm_rqm",
        /* single_angle_quotes */ "!text/single_laqm_raqm",
        /* double_angle_quotes */ "!text/double_laqm_raqm",
        // $ - I'm making ₹ as default
        // U+00A2: "¢" CENT SIGN
        // U+00A3: "£" POUND SIGN
        // U+20AC: "€" EURO SIGN
        // U+00A5: "¥" YEN SIGN
        // U+20B1: "₱" PESO SIGN
        /* morekeys_currency_dollar */ "$,\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
        /* keylabel_for_currency */ "$",
        /* morekeys_currency_generic */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
        /* morekeys_punctuation */ "!autoColumnOrder!8,\\,,?,!,#,!text/keyspec_right_parenthesis,!text/keyspec_left_parenthesis,/,;,',@,:,-,\",+,\\%,&",
        /* morekeys_tablet_punctuation */ "!autoColumnOrder!7,\\,,',#,!text/keyspec_right_parenthesis,!text/keyspec_left_parenthesis,/,;,@,:,-,\",+,\\%,&",
        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
        /* keyspec_spanish_row2_10 */ "\u00F1",
        // U+2020: "†" DAGGER
        // U+2021: "‡" DOUBLE DAGGER
        // U+2605: "★" BLACK STAR
        /* morekeys_star */ "\u2020,\u2021,\u2605",
        // U+266A: "♪" EIGHTH NOTE
        // U+2665: "♥" BLACK HEART SUIT
        // U+2660: "♠" BLACK SPADE SUIT
        // U+2666: "♦" BLACK DIAMOND SUIT
        // U+2663: "♣" BLACK CLUB SUIT
        /* morekeys_bullet */ "\u266A,\u2665,\u2660,\u2666,\u2663",
        // U+00B1: "±" PLUS-MINUS SIGN
        /* morekeys_plus */ "\u00B1",
        /* morekeys_left_parenthesis */ "!fixedColumnOrder!3,!text/keyspecs_left_parenthesis_more_keys",
        /* morekeys_right_parenthesis */ "!fixedColumnOrder!3,!text/keyspecs_right_parenthesis_more_keys",
        /* morekeys_less_than */ "!fixedColumnOrder!3,!text/keyspec_left_single_angle_quote,!text/keyspec_less_than_equal,!text/keyspec_left_double_angle_quote",
        /* morekeys_greater_than */ "!fixedColumnOrder!3,!text/keyspec_right_single_angle_quote,!text/keyspec_greater_than_equal,!text/keyspec_right_double_angle_quote",
        /* morekeys_arabic_diacritics */ EMPTY,
        // U+00B9: "¹" SUPERSCRIPT ONE
        // U+00BD: "½" VULGAR FRACTION ONE HALF
        // U+2153: "⅓" VULGAR FRACTION ONE THIRD
        // U+00BC: "¼" VULGAR FRACTION ONE QUARTER
        // U+215B: "⅛" VULGAR FRACTION ONE EIGHTH
        /* morekeys_symbols_1 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
        // U+00B2: "²" SUPERSCRIPT TWO
        // U+2154: "⅔" VULGAR FRACTION TWO THIRDS
        /* morekeys_symbols_2 */ "\u00B2,\u2154",
        // U+00B3: "³" SUPERSCRIPT THREE
        // U+00BE: "¾" VULGAR FRACTION THREE QUARTERS
        // U+215C: "⅜" VULGAR FRACTION THREE EIGHTHS
        /* morekeys_symbols_3 */ "\u00B3,\u00BE,\u215C",
        // U+2074: "⁴" SUPERSCRIPT FOUR
        /* morekeys_symbols_4 */ "\u2074",
        // U+215D: "⅝" VULGAR FRACTION FIVE EIGHTHS
        /* morekeys_symbols_5 */ "\u215D",
        /* morekeys_symbols_6 */ EMPTY,
        // U+215E: "⅞" VULGAR FRACTION SEVEN EIGHTHS
        /* morekeys_symbols_7 */ "\u215E",
        /* morekeys_symbols_8 */ EMPTY,
        /* morekeys_symbols_9 */ EMPTY,
        // U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N
        // U+2205: "∅" EMPTY SET
        /* morekeys_symbols_0 */ "\u207F,\u2205",
        // The all letters need to be mirrored are found at
        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
        // U+2264: "≤" LESS-THAN OR EQUAL TO
        // U+2265: "≥" GREATER-THAN EQUAL TO
        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
        /* keyspec_left_parenthesis */ "(",
        /* keyspec_right_parenthesis */ ")",
        /* keyspec_left_square_bracket */ "[",
        /* keyspec_right_square_bracket */ "]",
        /* keyspec_left_curly_bracket */ "{",
        /* keyspec_right_curly_bracket */ "}",
        /* keyspec_less_than */ "<",
        /* keyspec_greater_than */ ">",
        /* keyspec_less_than_equal */ "\u2264",
        /* keyspec_greater_than_equal */ "\u2265",
        /* keyspec_left_double_angle_quote */ "\u00AB",
        /* keyspec_right_double_angle_quote */ "\u00BB",
        /* keyspec_left_single_angle_quote */ "\u2039",
        /* keyspec_right_single_angle_quote */ "\u203A",
        // Comma key
        /* keyspec_comma */ ",",
        /* keyspec_tablet_comma */ ",",
        /* keyhintlabel_tablet_comma */ EMPTY,
        /* morekeys_tablet_comma */ EMPTY,
        // Period key
        /* keyspec_period */ ".",
        /* keyhintlabel_period */ EMPTY,
        /* morekeys_period */ "!text/morekeys_punctuation",
        /* keyspec_tablet_period */ ".",
        /* keyhintlabel_tablet_period */ EMPTY,
        /* morekeys_tablet_period */ "!text/morekeys_tablet_punctuation",
        /* keyspec_symbols_question */ "?",
        /* keyspec_symbols_semicolon */ ";",
        /* keyspec_symbols_percent */ "%",
        // U+00A1: "¡" INVERTED EXCLAMATION MARK
        /* morekeys_exclamation */ "\u00A1",
        // U+00BF: "¿" INVERTED QUESTION MARK
        /* morekeys_question */ "\u00BF",
        /* morekeys_symbols_semicolon */ EMPTY,
        // U+2030: "‰" PER MILLE SIGN
        /* morekeys_symbols_percent */ "\u2030",
        /* morekeys_am_pm */ "!fixedColumnOrder!2,!hasLabels!,!text/keylabel_time_am,!text/keylabel_time_pm",
        /* keyspec_settings */ "!icon/settings_key|!code/key_settings",
        /* keyspec_shortcut */ "!icon/shortcut_key|!code/key_shortcut",
        /* keyspec_action_next */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
        /* keyspec_action_previous */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
        // Label for "switch to more symbol" modifier key ("= \ <"). Must be short to fit on key!
        /* keylabel_to_more_symbol */ "= \\\\ <",
        // Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key!
        /* keylabel_tablet_to_more_symbol */ "~ [ <",
        // Label for "switch to phone numeric" key.  Must be short to fit on key!
        /* keylabel_to_phone_numeric */ "123",
        // Label for "switch to phone symbols" key.  Must be short to fit on key!
        // U+FF0A: "＊" FULLWIDTH ASTERISK
        // U+FF03: "＃" FULLWIDTH NUMBER SIGN
        /* keylabel_to_phone_symbols */ "\uFF0A\uFF03",
        // Key label for "ante meridiem"
        /* keylabel_time_am */ "AM",
        // Key label for "post meridiem"
        /* keylabel_time_pm */ "PM",
        /* keyspec_popular_domain */ ".com",
        // popular web domains for the locale - most popular, displayed on the keyboard
        /* morekeys_popular_domain */ "!hasLabels!,.net,.org,.gov,.edu",
        /* keyspecs_left_parenthesis_more_keys */ "!text/keyspec_less_than,!text/keyspec_left_curly_bracket,!text/keyspec_left_square_bracket",
        /* keyspecs_right_parenthesis_more_keys */ "!text/keyspec_greater_than,!text/keyspec_right_curly_bracket,!text/keyspec_right_square_bracket",
        // The following characters don't need BIDI mirroring.
        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
        // Abbreviations are:
        // laqm: LEFT-POINTING ANGLE QUOTATION MARK
        // raqm: RIGHT-POINTING ANGLE QUOTATION MARK
        // lqm: LEFT QUOTATION MARK
        // rqm: RIGHT QUOTATION MARK
        // 9qm: LOW-9 QUOTATION MARK
        // The following each quotation mark pair consist of
        // <opening quotation mark>, <closing quotation mark>
        // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
        /* single_laqm_raqm */ "!text/keyspec_left_single_angle_quote,!text/keyspec_right_single_angle_quote",
        /* single_raqm_laqm */ "!text/keyspec_right_single_angle_quote,!text/keyspec_left_single_angle_quote",
        /* double_laqm_raqm */ "!text/keyspec_left_double_angle_quote,!text/keyspec_right_double_angle_quote",
        /* double_raqm_laqm */ "!text/keyspec_right_double_angle_quote,!text/keyspec_left_double_angle_quote",
        // The following each quotation mark triplet consists of
        // <another quotation mark>, <opening quotation mark>, <closing quotation mark>
        // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
        /* single_lqm_rqm */ "\u201A,\u2018,\u2019",
        /* single_9qm_lqm */ "\u2019,\u201A,\u2018",
        /* single_9qm_rqm */ "\u2018,\u201A,\u2019",
        /* single_rqm_9qm */ "\u2018,\u2019,\u201A",
        /* double_lqm_rqm */ "\u201E,\u201C,\u201D",
        /* double_9qm_lqm */ "\u201D,\u201E,\u201C",
        /* double_9qm_rqm */ "\u201C,\u201E,\u201D",
        /* double_rqm_9qm */ "\u201C,\u201D,\u201E",
        /* morekeys_single_quote */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes",
        /* morekeys_double_quote */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes",
        /* morekeys_tablet_double_quote */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes",
        /* keyspec_emoji_action_key */ "!icon/emoji_action_key|!code/key_emoji",
    };

    /* Locale as_IN: Assamese (India) */
    private static final String[] TEXTS_as_IN = {
        /* keylabel_to_alpha */ "\u0985",
        /* additional_morekeys_symbols_1 */ "1",
        /* additional_morekeys_symbols_2 */ "2",
        /* additional_morekeys_symbols_3 */ "3",
        /* additional_morekeys_symbols_4 */ "4",
        /* additional_morekeys_symbols_5 */ "5",
        /* additional_morekeys_symbols_6 */ "6",
        /* additional_morekeys_symbols_7 */ "7",
        /* additional_morekeys_symbols_8 */ "8",
        /* additional_morekeys_symbols_9 */ "9",
        /* additional_morekeys_symbols_0 */ "0",
        /* keyspec_symbols_1 */ "\u09E7",
        /* keyspec_symbols_2 */ "\u09E8",
        /* keyspec_symbols_3 */ "\u09E9",
        /* keyspec_symbols_4 */ "\u09EA",
        /* keyspec_symbols_5 */ "\u09EB",
        /* keyspec_symbols_6 */ "\u09EC",
        /* keyspec_symbols_7 */ "\u09ED",
        /* keyspec_symbols_8 */ "\u09EE",
        /* keyspec_symbols_9 */ "\u09EF",
        /* keyspec_symbols_0 */ "\u09E6",
        /* keylabel_to_symbol */ "\u09E7\u09E8\u09E9",
    };

    /* Locale bn_IN: Bengali (India) */
    private static final String[] TEXTS_bn_IN = {
        /* keylabel_to_alpha */ "\u0985",
        /* additional_morekeys_symbols_1 */ "1",
        /* additional_morekeys_symbols_2 */ "2",
        /* additional_morekeys_symbols_3 */ "3",
        /* additional_morekeys_symbols_4 */ "4",
        /* additional_morekeys_symbols_5 */ "5",
        /* additional_morekeys_symbols_6 */ "6",
        /* additional_morekeys_symbols_7 */ "7",
        /* additional_morekeys_symbols_8 */ "8",
        /* additional_morekeys_symbols_9 */ "9",
        /* additional_morekeys_symbols_0 */ "0",
        /* keyspec_symbols_1 */ "\u09E7",
        /* keyspec_symbols_2 */ "\u09E8",
        /* keyspec_symbols_3 */ "\u09E9",
        /* keyspec_symbols_4 */ "\u09EA",
        /* keyspec_symbols_5 */ "\u09EB",
        /* keyspec_symbols_6 */ "\u09EC",
        /* keyspec_symbols_7 */ "\u09ED",
        /* keyspec_symbols_8 */ "\u09EE",
        /* keyspec_symbols_9 */ "\u09EF",
        /* keyspec_symbols_0 */ "\u09E6",
        /* keylabel_to_symbol */ "\u09E7\u09E8\u09E9",
    };

    /* Locale en: English */
    private static final String[] TEXTS_en = {
        /* keylabel_to_alpha ~ */
        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
        null, null, null, null, null, null, null,
        /* ~ keylabel_to_symbol */
        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
        // U+00E6: "æ" LATIN SMALL LETTER AE
        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
        /* morekeys_a */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
        /* morekeys_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0113",
        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
        /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u012B,\u00EC",
        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
        // U+0153: "œ" LATIN SMALL LIGATURE OE
        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
        /* morekeys_o */ "\u00F3,\u00F4,\u00F6,\u00F2,\u0153,\u00F8,\u014D,\u00F5",
        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
        /* morekeys_u */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B",
        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
        /* morekeys_s */ "\u00DF",
        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
        /* morekeys_n */ "\u00F1",
        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
        /* morekeys_c */ "\u00E7",
    };

    /* Locale hi_IN: Hindi (India) */
    private static final String[] TEXTS_hi_IN = {
        // Label for "switch to alphabetic" key.
        // U+0915: "क" DEVANAGARI LETTER KA
        // U+0916: "ख" DEVANAGARI LETTER KHA
        // U+0917: "ग" DEVANAGARI LETTER GA
        /* keylabel_to_alpha */ "\u0915\u0916\u0917",
        /* additional_morekeys_symbols_1 */ "1",
        /* additional_morekeys_symbols_2 */ "2",
        /* additional_morekeys_symbols_3 */ "3",
        /* additional_morekeys_symbols_4 */ "4",
        /* additional_morekeys_symbols_5 */ "5",
        /* additional_morekeys_symbols_6 */ "6",
        /* additional_morekeys_symbols_7 */ "7",
        /* additional_morekeys_symbols_8 */ "8",
        /* additional_morekeys_symbols_9 */ "9",
        /* additional_morekeys_symbols_0 */ "0",
        // U+0967: "१" DEVANAGARI DIGIT ONE
        /* keyspec_symbols_1 */ "\u0967",
        // U+0968: "२" DEVANAGARI DIGIT TWO
        /* keyspec_symbols_2 */ "\u0968",
        // U+0969: "३" DEVANAGARI DIGIT THREE
        /* keyspec_symbols_3 */ "\u0969",
        // U+096A: "४" DEVANAGARI DIGIT FOUR
        /* keyspec_symbols_4 */ "\u096A",
        // U+096B: "५" DEVANAGARI DIGIT FIVE
        /* keyspec_symbols_5 */ "\u096B",
        // U+096C: "६" DEVANAGARI DIGIT SIX
        /* keyspec_symbols_6 */ "\u096C",
        // U+096D: "७" DEVANAGARI DIGIT SEVEN
        /* keyspec_symbols_7 */ "\u096D",
        // U+096E: "८" DEVANAGARI DIGIT EIGHT
        /* keyspec_symbols_8 */ "\u096E",
        // U+096F: "९" DEVANAGARI DIGIT NINE
        /* keyspec_symbols_9 */ "\u096F",
        // U+0966: "०" DEVANAGARI DIGIT ZERO
        /* keyspec_symbols_0 */ "\u0966",
        // Label for "switch to symbols" key.
        /* keylabel_to_symbol */ "?\u0967\u0968\u0969",
    };

    /* Locale kn_IN: Kannada (India) */
    private static final String[] TEXTS_kn_IN = {
        /* keylabel_to_alpha */ "\u0C85",
        /* additional_morekeys_symbols_1 */ "1",
        /* additional_morekeys_symbols_2 */ "2",
        /* additional_morekeys_symbols_3 */ "3",
        /* additional_morekeys_symbols_4 */ "4",
        /* additional_morekeys_symbols_5 */ "5",
        /* additional_morekeys_symbols_6 */ "6",
        /* additional_morekeys_symbols_7 */ "7",
        /* additional_morekeys_symbols_8 */ "8",
        /* additional_morekeys_symbols_9 */ "9",
        /* additional_morekeys_symbols_0 */ "0",
        /* keyspec_symbols_1 */ "\u0CE7",
        /* keyspec_symbols_2 */ "\u0CE8",
        /* keyspec_symbols_3 */ "\u0CE9",
        /* keyspec_symbols_4 */ "\u0CEA",
        /* keyspec_symbols_5 */ "\u0CEB",
        /* keyspec_symbols_6 */ "\u0CEC",
        /* keyspec_symbols_7 */ "\u0CED",
        /* keyspec_symbols_8 */ "\u0CEE",
        /* keyspec_symbols_9 */ "\u0CEF",
        /* keyspec_symbols_0 */ "\u0CE6",
        /* keylabel_to_symbol */ "\u0CE7\u0CE8\u0CE9",
    };

    /* Locale ml_IN: Malayalam (India) */
    private static final String[] TEXTS_ml_IN = {
        /* keylabel_to_alpha */ "\u0D05",
        // U+0966: "൧" MALAYALAM DIGIT ONE
        /* additional_morekeys_symbols_1 */ "\u0D67",
        // U+0966: "൨" MALAYALAM DIGIT TWO
        /* additional_morekeys_symbols_2 */ "\u0D68",
        // U+0966: "൩" MALAYALAM DIGIT THREE
        /* additional_morekeys_symbols_3 */ "\u0D69",
        // U+0966: "൪" MALAYALAM DIGIT FOUR
        /* additional_morekeys_symbols_4 */ "\u0D6A",
        // U+0966: "൫" MALAYALAM DIGIT FIVE
        /* additional_morekeys_symbols_5 */ "\u0D6B",
        // U+0966: "൬" MALAYALAM DIGIT SIX
        /* additional_morekeys_symbols_6 */ "\u0D6C",
        // U+0966: "൭" MALAYALAM DIGIT SEVEN
        /* additional_morekeys_symbols_7 */ "\u0D6D",
        // U+0966: "൮" MALAYALAM DIGIT EIGHT
        /* additional_morekeys_symbols_8 */ "\u0D6E",
        // U+0966: "൯" MALAYALAM DIGIT NINE
        /* additional_morekeys_symbols_9 */ "\u0D6F",
        // U+0966: "൦" MALAYALAM DIGIT ZERO
        /* additional_morekeys_symbols_0 */ "\u0D66",
    };

    /* Locale mr_IN: Marathi (India) */
    private static final String[] TEXTS_mr_IN = {
        // Label for "switch to alphabetic" key.
        // U+0915: "क" DEVANAGARI LETTER KA
        // U+0916: "ख" DEVANAGARI LETTER KHA
        // U+0917: "ग" DEVANAGARI LETTER GA
        /* keylabel_to_alpha */ "\u0915\u0916\u0917",
        /* additional_morekeys_symbols_1 */ "1",
        /* additional_morekeys_symbols_2 */ "2",
        /* additional_morekeys_symbols_3 */ "3",
        /* additional_morekeys_symbols_4 */ "4",
        /* additional_morekeys_symbols_5 */ "5",
        /* additional_morekeys_symbols_6 */ "6",
        /* additional_morekeys_symbols_7 */ "7",
        /* additional_morekeys_symbols_8 */ "8",
        /* additional_morekeys_symbols_9 */ "9",
        /* additional_morekeys_symbols_0 */ "0",
        // U+0967: "१" DEVANAGARI DIGIT ONE
        /* keyspec_symbols_1 */ "\u0967",
        // U+0968: "२" DEVANAGARI DIGIT TWO
        /* keyspec_symbols_2 */ "\u0968",
        // U+0969: "३" DEVANAGARI DIGIT THREE
        /* keyspec_symbols_3 */ "\u0969",
        // U+096A: "४" DEVANAGARI DIGIT FOUR
        /* keyspec_symbols_4 */ "\u096A",
        // U+096B: "५" DEVANAGARI DIGIT FIVE
        /* keyspec_symbols_5 */ "\u096B",
        // U+096C: "६" DEVANAGARI DIGIT SIX
        /* keyspec_symbols_6 */ "\u096C",
        // U+096D: "७" DEVANAGARI DIGIT SEVEN
        /* keyspec_symbols_7 */ "\u096D",
        // U+096E: "८" DEVANAGARI DIGIT EIGHT
        /* keyspec_symbols_8 */ "\u096E",
        // U+096F: "९" DEVANAGARI DIGIT NINE
        /* keyspec_symbols_9 */ "\u096F",
        // U+0966: "०" DEVANAGARI DIGIT ZERO
        /* keyspec_symbols_0 */ "\u0966",
        // Label for "switch to symbols" key.
        /* keylabel_to_symbol */ "?\u0967\u0968\u0969",
    };

    /* Locale my: Burmese */
    private static final String[] TEXTS_my = {
        /* keylabel_to_alpha */ "\u1000",
        /* additional_morekeys_symbols_1 */ "1",
        /* additional_morekeys_symbols_2 */ "2",
        /* additional_morekeys_symbols_3 */ "3",
        /* additional_morekeys_symbols_4 */ "4",
        /* additional_morekeys_symbols_5 */ "5",
        /* additional_morekeys_symbols_6 */ "6",
        /* additional_morekeys_symbols_7 */ "7",
        /* additional_morekeys_symbols_8 */ "8",
        /* additional_morekeys_symbols_9 */ "9",
        /* additional_morekeys_symbols_0 */ "0",
        /* keyspec_symbols_1 */ "\u1041",
        /* keyspec_symbols_2 */ "\u1042",
        /* keyspec_symbols_3 */ "\u1043",
        /* keyspec_symbols_4 */ "\u1044",
        /* keyspec_symbols_5 */ "\u1045",
        /* keyspec_symbols_6 */ "\u1046",
        /* keyspec_symbols_7 */ "\u1047",
        /* keyspec_symbols_8 */ "\u1048",
        /* keyspec_symbols_9 */ "\u1049",
        /* keyspec_symbols_0 */ "\u1040",
        // Label for "switch to symbols" key.
        /* keylabel_to_symbol */ "\u1041",
    };

    /* Locale ne_NP: Nepali (Nepal) */
    private static final String[] TEXTS_ne_NP = {
        // Label for "switch to alphabetic" key.
        // U+0915: "क" DEVANAGARI LETTER KA
        // U+0916: "ख" DEVANAGARI LETTER KHA
        // U+0917: "ग" DEVANAGARI LETTER GA
        /* keylabel_to_alpha */ "\u0915\u0916\u0917",
        /* additional_morekeys_symbols_1 */ "1",
        /* additional_morekeys_symbols_2 */ "2",
        /* additional_morekeys_symbols_3 */ "3",
        /* additional_morekeys_symbols_4 */ "4",
        /* additional_morekeys_symbols_5 */ "5",
        /* additional_morekeys_symbols_6 */ "6",
        /* additional_morekeys_symbols_7 */ "7",
        /* additional_morekeys_symbols_8 */ "8",
        /* additional_morekeys_symbols_9 */ "9",
        /* additional_morekeys_symbols_0 */ "0",
        // U+0967: "१" DEVANAGARI DIGIT ONE
        /* keyspec_symbols_1 */ "\u0967",
        // U+0968: "२" DEVANAGARI DIGIT TWO
        /* keyspec_symbols_2 */ "\u0968",
        // U+0969: "३" DEVANAGARI DIGIT THREE
        /* keyspec_symbols_3 */ "\u0969",
        // U+096A: "४" DEVANAGARI DIGIT FOUR
        /* keyspec_symbols_4 */ "\u096A",
        // U+096B: "५" DEVANAGARI DIGIT FIVE
        /* keyspec_symbols_5 */ "\u096B",
        // U+096C: "६" DEVANAGARI DIGIT SIX
        /* keyspec_symbols_6 */ "\u096C",
        // U+096D: "७" DEVANAGARI DIGIT SEVEN
        /* keyspec_symbols_7 */ "\u096D",
        // U+096E: "८" DEVANAGARI DIGIT EIGHT
        /* keyspec_symbols_8 */ "\u096E",
        // U+096F: "९" DEVANAGARI DIGIT NINE
        /* keyspec_symbols_9 */ "\u096F",
        // U+0966: "०" DEVANAGARI DIGIT ZERO
        /* keyspec_symbols_0 */ "\u0966",
        // Label for "switch to symbols" key.
        /* keylabel_to_symbol */ "?\u0967\u0968\u0969",
    };

    /* Locale or_IN: Oriya (India) */
    private static final String[] TEXTS_or_IN = {
        /* keylabel_to_alpha */ "\u0B05",
        /* additional_morekeys_symbols_1 */ "1",
        /* additional_morekeys_symbols_2 */ "2",
        /* additional_morekeys_symbols_3 */ "3",
        /* additional_morekeys_symbols_4 */ "4",
        /* additional_morekeys_symbols_5 */ "5",
        /* additional_morekeys_symbols_6 */ "6",
        /* additional_morekeys_symbols_7 */ "7",
        /* additional_morekeys_symbols_8 */ "8",
        /* additional_morekeys_symbols_9 */ "9",
        /* additional_morekeys_symbols_0 */ "0",
        /* keyspec_symbols_1 */ "\u0B67",
        /* keyspec_symbols_2 */ "\u0B68",
        /* keyspec_symbols_3 */ "\u0B69",
        /* keyspec_symbols_4 */ "\u0B6A",
        /* keyspec_symbols_5 */ "\u0B6B",
        /* keyspec_symbols_6 */ "\u0B6C",
        /* keyspec_symbols_7 */ "\u0B6D",
        /* keyspec_symbols_8 */ "\u0B6E",
        /* keyspec_symbols_9 */ "\u0B6F",
        /* keyspec_symbols_0 */ "\u0B66",
        /* keylabel_to_symbol */ "\u0B67\u0B68\u0B69",
    };

    /* Locale pa_IN: Panjabi (India) */
    private static final String[] TEXTS_pa_IN = {
        /* keylabel_to_alpha */ "\u0A05",
        /* additional_morekeys_symbols_1 */ "1",
        /* additional_morekeys_symbols_2 */ "2",
        /* additional_morekeys_symbols_3 */ "3",
        /* additional_morekeys_symbols_4 */ "4",
        /* additional_morekeys_symbols_5 */ "5",
        /* additional_morekeys_symbols_6 */ "6",
        /* additional_morekeys_symbols_7 */ "7",
        /* additional_morekeys_symbols_8 */ "8",
        /* additional_morekeys_symbols_9 */ "9",
        /* additional_morekeys_symbols_0 */ "0",
        /* keyspec_symbols_1 */ "\u0A67",
        /* keyspec_symbols_2 */ "\u0A68",
        /* keyspec_symbols_3 */ "\u0A69",
        /* keyspec_symbols_4 */ "\u0A6A",
        /* keyspec_symbols_5 */ "\u0A6B",
        /* keyspec_symbols_6 */ "\u0A6C",
        /* keyspec_symbols_7 */ "\u0A6D",
        /* keyspec_symbols_8 */ "\u0A6E",
        /* keyspec_symbols_9 */ "\u0A6F",
        /* keyspec_symbols_0 */ "\u0A66",
        /* keylabel_to_symbol */ "\u0A67\u0A68\u0A69",
    };

    /* Locale ta_IN: Tamil (India) */
    private static final String[] TEXTS_ta_IN = {
        /* keylabel_to_alpha */ "\u0B85",
        /* additional_morekeys_symbols_1 */ "1",
        /* additional_morekeys_symbols_2 */ "2",
        /* additional_morekeys_symbols_3 */ "3",
        /* additional_morekeys_symbols_4 */ "4",
        /* additional_morekeys_symbols_5 */ "5",
        /* additional_morekeys_symbols_6 */ "6",
        /* additional_morekeys_symbols_7 */ "7",
        /* additional_morekeys_symbols_8 */ "8",
        /* additional_morekeys_symbols_9 */ "9",
        /* additional_morekeys_symbols_0 */ "0",
        // U+0BE7: "௧" TAMIL DIGIT ONE
        /* keyspec_symbols_1 */ "\u0BE7",
        // U+0BE8: "௨" TAMIL DIGIT TWO
        /* keyspec_symbols_2 */ "\u0BE8",
        // U+0BE9: "௩" TAMIL DIGIT THREE
        /* keyspec_symbols_3 */ "\u0BE9",
        // U+0BEA: "௪" TAMIL DIGIT FOUR
        /* keyspec_symbols_4 */ "\u0BEA",
        // U+0BEB: "௫" TAMIL DIGIT FIVE
        /* keyspec_symbols_5 */ "\u0BEB",
        // U+0BEC: "௬" TAMIL DIGIT SIX
        /* keyspec_symbols_6 */ "\u0BEC",
        // U+0BED: "௭" TAMIL DIGIT SEVEN
        /* keyspec_symbols_7 */ "\u0BED",
        // U+0BEE: "௮" TAMIL DIGIT EIGHT
        /* keyspec_symbols_8 */ "\u0BEE",
        // U+0BEF: "௯" TAMIL DIGIT NINE
        /* keyspec_symbols_9 */ "\u0BEF",
        // U+0BE6: "௦" TAMIL DIGIT ZERO
        /* keyspec_symbols_0 */ "\u0BE6",
        /* keylabel_to_symbol */ "\u0BE7\u0BE8\u0BE9",
    };

    /* Locale te_IN: Telugu (India) */
    private static final String[] TEXTS_te_IN = {
        /* keylabel_to_alpha */ "\u0C05",
        /* additional_morekeys_symbols_1 */ "1",
        /* additional_morekeys_symbols_2 */ "2",
        /* additional_morekeys_symbols_3 */ "3",
        /* additional_morekeys_symbols_4 */ "4",
        /* additional_morekeys_symbols_5 */ "5",
        /* additional_morekeys_symbols_6 */ "6",
        /* additional_morekeys_symbols_7 */ "7",
        /* additional_morekeys_symbols_8 */ "8",
        /* additional_morekeys_symbols_9 */ "9",
        /* additional_morekeys_symbols_0 */ "0",
        /* keyspec_symbols_1 */ "\u0C67",
        /* keyspec_symbols_2 */ "\u0C68",
        /* keyspec_symbols_3 */ "\u0C69",
        /* keyspec_symbols_4 */ "\u0C6A",
        /* keyspec_symbols_5 */ "\u0C6B",
        /* keyspec_symbols_6 */ "\u0C6C",
        /* keyspec_symbols_7 */ "\u0C6D",
        /* keyspec_symbols_8 */ "\u0C6E",
        /* keyspec_symbols_9 */ "\u0C6F",
        /* keyspec_symbols_0 */ "\u0C66",
        /* keylabel_to_symbol */ "\u0C67\u0C68\u0C69",
    };

    /* Locale zz: Alphabet */
    private static final String[] TEXTS_zz = {
        /* keylabel_to_alpha ~ */
        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
        null, null, null, null, null, null, null,
        /* ~ keylabel_to_symbol */
        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
        // U+00E6: "æ" LATIN SMALL LETTER AE
        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
        /* morekeys_a */ "\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u0101,\u0103,\u0105,\u00AA",
        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
        // U+0115: "ĕ" LATIN SMALL LETTER E WITH BREVE
        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
        /* morekeys_e */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113,\u0115,\u0117,\u0119,\u011B",
        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
        // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
        // U+012D: "ĭ" LATIN SMALL LETTER I WITH BREVE
        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
        // U+0133: "ĳ" LATIN SMALL LIGATURE IJ
        /* morekeys_i */ "\u00EC,\u00ED,\u00EE,\u00EF,\u0129,\u012B,\u012D,\u012F,\u0131,\u0133",
        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
        // U+014F: "ŏ" LATIN SMALL LETTER O WITH BREVE
        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
        // U+0153: "œ" LATIN SMALL LIGATURE OE
        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
        /* morekeys_o */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u00F8,\u014D,\u014F,\u0151,\u0153,\u00BA",
        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
        // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE
        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
        // U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE
        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
        /* morekeys_u */ "\u00F9,\u00FA,\u00FB,\u00FC,\u0169,\u016B,\u016D,\u016F,\u0171,\u0173",
        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
        // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
        // U+017F: "ſ" LATIN SMALL LETTER LONG S
        /* morekeys_s */ "\u00DF,\u015B,\u015D,\u015F,\u0161,\u017F",
        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
        // U+0149: "ŉ" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
        // U+014B: "ŋ" LATIN SMALL LETTER ENG
        /* morekeys_n */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
        // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
        // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE
        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
        /* morekeys_c */ "\u00E7,\u0107,\u0109,\u010B,\u010D",
        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
        // U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX
        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
        // U+0133: "ĳ" LATIN SMALL LIGATURE IJ
        /* morekeys_y */ "\u00FD,\u0177,\u00FF,\u0133",
        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
        // U+00F0: "ð" LATIN SMALL LETTER ETH
        /* morekeys_d */ "\u010F,\u0111,\u00F0",
        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
        /* morekeys_r */ "\u0155,\u0157,\u0159",
        // U+00FE: "þ" LATIN SMALL LETTER THORN
        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
        // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE
        /* morekeys_t */ "\u00FE,\u0163,\u0165,\u0167",
        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
        /* morekeys_z */ "\u017A,\u017C,\u017E",
        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
        // U+0138: "ĸ" LATIN SMALL LETTER KRA
        /* morekeys_k */ "\u0137,\u0138",
        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
        // U+0140: "ŀ" LATIN SMALL LETTER L WITH MIDDLE DOT
        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
        /* morekeys_l */ "\u013A,\u013C,\u013E,\u0140,\u0142",
        // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
        // U+0121: "ġ" LATIN SMALL LETTER G WITH DOT ABOVE
        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
        /* morekeys_g */ "\u011D,\u011F,\u0121,\u0123",
        // U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX
        /* morekeys_h */ "\u0125",
        // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
        /* morekeys_j */ "\u0135",
        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
        /* morekeys_w */ "\u0175",
    };

    private static final Object[] LOCALES_AND_TEXTS = {
    // "locale", TEXT_ARRAY,  /* numberOfNonNullText/lengthOf_TEXT_ARRAY localeName */
        "DEFAULT", TEXTS_DEFAULT, /* 168/168 DEFAULT */
        "as_IN"  , TEXTS_as_IN, /*  22/ 22 Assamese (India) */
        "bn_IN"  , TEXTS_bn_IN, /*  22/ 22 Bengali (India) */
        "en"     , TEXTS_en,    /*   8/ 30 English */
        "hi_IN"  , TEXTS_hi_IN, /*  22/ 22 Hindi (India) */
        "kn_IN"  , TEXTS_kn_IN, /*  22/ 22 Kannada (India) */
        "ml_IN"  , TEXTS_ml_IN, /*  11/ 11 Malayalam (India) */
        "mr_IN"  , TEXTS_mr_IN, /*  22/ 22 Marathi (India) */
        "my"     , TEXTS_my,    /*  22/ 22 Burmese */
        "ne_NP"  , TEXTS_ne_NP, /*  22/ 22 Nepali (Nepal) */
        "or_IN"  , TEXTS_or_IN, /*  22/ 22 Oriya (India) */
        "pa_IN"  , TEXTS_pa_IN, /*  22/ 22 Panjabi (India) */
        "ta_IN"  , TEXTS_ta_IN, /*  22/ 22 Tamil (India) */
        "te_IN"  , TEXTS_te_IN, /*  22/ 22 Telugu (India) */
        "zz"     , TEXTS_zz,    /*  19/ 41 Alphabet */
    };

    static {
        for (int index = 0; index < NAMES.length; index++) {
            sNameToIndexesMap.put(NAMES[index], index);
        }

        for (int i = 0; i < LOCALES_AND_TEXTS.length; i += 2) {
            final String locale = (String)LOCALES_AND_TEXTS[i];
            final String[] textsTable = (String[])LOCALES_AND_TEXTS[i + 1];
            sLocaleToTextsTableMap.put(locale, textsTable);
            sTextsTableToLocaleMap.put(textsTable, locale);
        }
    }
}
